// 用户相关的路由表

// 创建路由表(空表)
let router = require('express').Router()
let jwt = require('jsonwebtoken')
let userModel = require('../db/models/userModel')
let mail = require('../utils/email')

// 向路由表中添加内容:

/**
 * @api {post} /user/login 用户登录接口
 * @apiGroup user
 *
 * @apiParam {String} user 用户账号
 * @apiParam {String} pass 用户密码
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "code": 1,
 *     "msg": "登录成功"
 * }
 */
router.post('/login',(req,res)=>{
    // 获取前端传递的账号和密码
    let {user,pass} = req.body
    // 校验账号密码
    let reg = /^\w{6,16}$/
    if (reg.test(user) && reg.test(pass)) {
        // 查询数据库
        userModel.find({$and:[{user},{pass}]})
        .then((arr)=>{
            if (arr.length === 1) {
                // token中保存的用户信息
                let userInfo = {
                    user: arr[0].user,
                    nick: arr[0].nick,
                    sex: arr[0].sex,
                    age: arr[0].age
                }
                // 生成token
                let token = jwt.sign(userInfo,'hehehaha',{expiresIn:60*30})

                // 账号密码匹配成功
                res.send({"code":1,"msg":"登录成功","token":token})
            } else {
                // 账号密码匹配不成功
                res.send({"code":0,"msg":"账号或密码错误"})
            }
        })
        .catch((err)=>{
            // 出错或失败时
            res.send({"code":-2,"msg":err})
        })
    }
    else{
        // 格式错误,响应前端
        res.send({"code":-1,"msg":"账号或密码格式错误"})
    }
})

/**
 * @api {get} /user/islogin 判断是否登录接口
 * @apiGroup user
 *
 * @apiParam {String} authorization 请求头携带token参数
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "code": 1,
 *     "msg": "已登录",
 *     "userInfo": {user:'xiaocuo',nick:'小错'}
 * }
 */
router.get('/islogin',(req,res)=>{
    // 获取前端携带过来的token字符串
    const token = req.headers.authorization

    // 验证token
    jwt.verify(token,'hehehaha',(err,data)=>{
        if (err) {
            // token验证失败
            // 响应前端
            res.send({"code":0,"msg":"未登录"})
        } else {
            // token验证成功
            res.send({"code":1,"msg":"已登录","userInfo":data})
        }
    })
})

// 缓存验证码
let cacheCode = {
    // '570062873@qq.com': '75342',
    // '123236332@qq.com': '63252',
}

/**
 * @api {post} /user/register 用户注册接口
 * @apiGroup user
 *
 * @apiParam {String} user 用户账号
 * @apiParam {String} pass 用户密码
 * @apiParam {String} nick 用户昵称
 * @apiParam {String} email 用户邮箱
 * @apiParam {String} sex 用户性别
 * @apiParam {String} age 用户年龄
 * @apiParam {String} code 邮箱验证码
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "code": 1,
 *     "msg": "注册成功"
 * }
 */
router.post('/register',(req,res)=>{
    // 获取前端提交的参数
    let {user,pass,nick,email,sex,age,code} = req.body
    // 校验数据格式
    let upReg = /^\w{6,16}$/
    if (!upReg.test(user)) {
        return res.send({"code":-1,"msg":"账号格式错误"})
    }
    if (!upReg.test(pass)) {
        return res.send({"code":-2,"msg":"密码格式错误"})
    }
    let nickReg = /^.{2,12}$/
    if (!nickReg.test(nick)) {
        return res.send({"code":-3,"msg":"昵称格式错误"})
    }
    // '99838248@qq.com'  'zhangsan_123@sohu.com'
    let emailReg = /^\w{6,20}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/
    if (!emailReg.test(email)) {
        return res.send({"code":-4,"msg":"邮箱格式错误"})
    }
    let sexReg = /^[男女妖]$/
    if (!sexReg.test(sex)) {
        return res.send({"code":-5,"msg":"性别格式错误"})
    }
    let ageReg = /^\d{1,3}$/
    if (!ageReg.test(age)) {
        return res.send({"code":-6,"msg":"年龄格式错误"})
    }
    // 验证邮箱验证码
    if (code !== cacheCode[email]) {
        return res.send({"code":-7,"msg":"邮箱验证码错误"})
    }

    // 查询数据库是否已有当前要注册的账号
    userModel.find({user})// p1
    .then((arr)=>{
        if (arr.length === 1) {
            // 该账号已注册
            res.send({"code":-1,"msg":"该账号已存在"})
            return new Promise(()=>{})// 终止链式调用
        } else {
            // 可以注册该账号,插入一条用户数据
            return userModel.insertMany({user,pass,nick,email,sex,age})
        }
    })// p2
    .then((arr)=>{
        res.send({"code":1,"msg":"注册成功"})
    })
    .catch((err)=>{
        res.send({"code":0,"msg":"注册失败,请重试"})
    })
})


/**
 * @api {post} /user/sendmail 发送邮箱验证码接口
 * @apiGroup user
 *
 * @apiParam {String} email 用户邮箱
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "code": 1,
 *     "msg": "邮箱验证码发送成功"
 * }
 */
router.post('/sendmail',(req,res)=>{
    // 获取前端传递参数
    let {email} = req.body
    // 验证邮箱格式
    let emailReg = /^\w{6,20}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/
    if (!emailReg.test(email)) {
        return res.send({"code":-1,"msg":"邮箱格式错误"})
    }
    // 生成随机验证码
    let code = parseInt( Math.random()*1000000 )
    // 发送邮件
    mail.sendMail('注册邮箱验证码','您的验证码是:'+code,email)
    .then((msg)=>{
        // 缓存当前邮箱账号的验证码
        cacheCode[email] = code+''
        // 响应前端
        res.send({"code":1,"msg":"邮箱验证码发送成功"})
    })
    .catch((msg)=>{
        // 响应前端
        res.send({"code":0,"msg":"邮箱验证码发送失败"})
    })
})

// 导出路由表
module.exports = router
